package blbetter.training;

import blbetter.netze.NetLoader;

public abstract class Trainer {

	public static int explMul;

	public String folder, path;

	public int anzSpiele = 0;

	public int trained;

	public int saveAll = 50000;

	public NetLoader netload;

	public Trainer(NetLoader netload, String path, int saveAll) {
		this.netload = netload;
		this.path = path;
		this.saveAll = saveAll;
		this.folder = path.substring(0, path.lastIndexOf("/"));
		this.trained = Integer.parseInt(path.substring(
				path.lastIndexOf("/") + 1, path.length()));
	}

	public void train() throws Exception {
		double start = System.currentTimeMillis();
		for (; trainSpiel(); anzSpiele++) {
			if (anzSpiele % 10000 == 0) {
				System.out.println(anzSpiele + " - "
						+ (System.currentTimeMillis() - start) / 1000 + "s");
				start = System.currentTimeMillis();
				explMul = 2 + ((trained + anzSpiele) / 100000);
			}
			statistik();
			if ((trained + anzSpiele) % saveAll == 0 && anzSpiele > 0) {
				netload.saveAll(folder + "/" + (trained + anzSpiele));
				statistikAusgeben();
			}
		}
		System.out.println("TRAINER: Training finished. Games: " + anzSpiele);
		netload.saveAll(folder + "/" + (trained + anzSpiele));
		statistikAusgeben();
	}

	public abstract boolean trainSpiel() throws Exception;

	public abstract void statistik();

	public abstract void statistikAusgeben();

}
